@echo off
echo ================================================
echo 课程中心微服务端到端测试运行脚本
echo ================================================

:: 设置颜色
color 0A

:: 检查Node.js环境
echo 检查Node.js环境...
node --version >nul 2>&1
if %errorlevel% neq 0 (
    echo [错误] 未找到Node.js，请先安装Node.js
    pause
    exit /b 1
)

:: 检查npm环境
echo 检查npm环境...
npm --version >nul 2>&1
if %errorlevel% neq 0 (
    echo [错误] 未找到npm，请检查Node.js安装
    pause
    exit /b 1
)

:: 进入前端目录
cd /d "%~dp0\.."
echo 当前工作目录: %cd%

:: 检查package.json
if not exist package.json (
    echo [错误] 未找到package.json文件
    pause
    exit /b 1
)

:: 检查Cypress配置
if not exist cypress.config.js (
    echo [错误] 未找到cypress.config.js文件
    pause
    exit /b 1
)

echo.
echo ================================================
echo 第一步: 检查依赖项
echo ================================================

:: 检查Cypress是否已安装
npm list cypress >nul 2>&1
if %errorlevel% neq 0 (
    echo [警告] Cypress未安装，正在安装...
    npm install cypress --save-dev
    if %errorlevel% neq 0 (
        echo [错误] Cypress安装失败
        pause
        exit /b 1
    )
)

echo [信息] 依赖项检查完成

echo.
echo ================================================
echo 第二步: 检查后端服务状态
echo ================================================

:: 检查API网关是否运行
echo 检查API网关 (http://localhost:8081)...
curl -s --connect-timeout 5 http://localhost:8081/actuator/health >nul 2>&1
if %errorlevel% neq 0 (
    echo [警告] API网关似乎未运行，请确保后端服务已启动
    echo.
    echo 启动后端服务的方法:
    echo 1. 进入后端目录: cd ..\backend\microservices
    echo 2. 运行: docker-compose up -d
    echo 或者运行: start-all-services.bat
    echo.
    set /p choice="是否继续运行测试? (y/n): "
    if /i "%choice%" neq "y" (
        echo 测试已取消
        pause
        exit /b 1
    )
) else (
    echo [信息] API网关运行正常
)

:: 检查各个微服务
echo 检查用户管理服务 (http://localhost:8082)...
curl -s --connect-timeout 3 http://localhost:8082/actuator/health >nul 2>&1
if %errorlevel% equ 0 (
    echo [信息] 用户管理服务运行正常
) else (
    echo [警告] 用户管理服务可能未运行
)

echo 检查课程管理服务 (http://localhost:8083)...
curl -s --connect-timeout 3 http://localhost:8083/actuator/health >nul 2>&1
if %errorlevel% equ 0 (
    echo [信息] 课程管理服务运行正常
) else (
    echo [警告] 课程管理服务可能未运行
)

echo 检查练习管理服务 (http://localhost:8084)...
curl -s --connect-timeout 3 http://localhost:8084/actuator/health >nul 2>&1
if %errorlevel% equ 0 (
    echo [信息] 练习管理服务运行正常
) else (
    echo [警告] 练习管理服务可能未运行
)

echo 检查学习进度服务 (http://localhost:8085)...
curl -s --connect-timeout 3 http://localhost:8085/actuator/health >nul 2>&1
if %errorlevel% equ 0 (
    echo [信息] 学习进度服务运行正常
) else (
    echo [警告] 学习进度服务可能未运行
)

echo.
echo ================================================
echo 第三步: 选择测试模式
echo ================================================

echo 请选择测试运行模式:
echo 1. 无头模式 (headless) - 适合CI/CD
echo 2. 有界面模式 (headed) - 适合调试
echo 3. 交互模式 - 打开Cypress测试界面
echo 4. 运行特定测试文件
echo 5. 运行所有测试 (推荐)

set /p mode="请输入选择 (1-5): "

if "%mode%"=="1" goto headless
if "%mode%"=="2" goto headed
if "%mode%"=="3" goto interactive
if "%mode%"=="4" goto specific
if "%mode%"=="5" goto all
goto invalid_choice

:headless
echo.
echo [信息] 运行无头模式测试...
npx cypress run --headless
goto end

:headed
echo.
echo [信息] 运行有界面模式测试...
npx cypress run
goto end

:interactive
echo.
echo [信息] 打开Cypress测试界面...
npx cypress open
goto end

:specific
echo.
echo 可用的测试文件:
echo 1. auth.cy.js - 用户认证测试
echo 2. course.cy.js - 课程管理测试
echo 3. exercise.cy.js - 练习模块测试
echo 4. user_center.cy.js - 用户中心测试
echo 5. user_password_change.cy.js - 密码修改测试
echo 6. course_inside.cy.js - 课程内部测试
echo 7. learning_records.cy.js - 学习记录测试 (新)
echo 8. user_center_enhanced.cy.js - 增强用户中心测试 (新)
echo 9. course_content.cy.js - 课程内容测试 (新)

set /p file_choice="请选择要运行的测试文件编号: "

if "%file_choice%"=="1" set test_file=auth.cy.js
if "%file_choice%"=="2" set test_file=course.cy.js
if "%file_choice%"=="3" set test_file=exercise.cy.js
if "%file_choice%"=="4" set test_file=user_center.cy.js
if "%file_choice%"=="5" set test_file=user_password_change.cy.js
if "%file_choice%"=="6" set test_file=course_inside.cy.js
if "%file_choice%"=="7" set test_file=learning_records.cy.js
if "%file_choice%"=="8" set test_file=user_center_enhanced.cy.js
if "%file_choice%"=="9" set test_file=course_content.cy.js

if not defined test_file (
    echo [错误] 无效的选择
    goto end
)

echo.
echo [信息] 运行测试文件: %test_file%
npx cypress run --spec "cypress/e2e/%test_file%"
goto end

:all
echo.
echo [信息] 运行所有端到端测试...
echo.
echo 测试执行顺序:
echo 1. 用户认证测试
echo 2. 课程管理测试
echo 3. 课程内容测试
echo 4. 练习模块测试
echo 5. 用户中心测试
echo 6. 学习记录测试
echo.

:: 按顺序运行测试
echo [1/6] 运行用户认证测试...
npx cypress run --spec "cypress/e2e/auth.cy.js" --reporter json --reporter-options "toConsole=false"

echo [2/6] 运行课程管理测试...
npx cypress run --spec "cypress/e2e/course.cy.js" --reporter json --reporter-options "toConsole=false"

echo [3/6] 运行课程内容测试...
npx cypress run --spec "cypress/e2e/course_content.cy.js" --reporter json --reporter-options "toConsole=false"

echo [4/6] 运行练习模块测试...
npx cypress run --spec "cypress/e2e/exercise.cy.js" --reporter json --reporter-options "toConsole=false"

echo [5/6] 运行用户中心测试...
npx cypress run --spec "cypress/e2e/user_center_enhanced.cy.js" --reporter json --reporter-options "toConsole=false"

echo [6/6] 运行学习记录测试...
npx cypress run --spec "cypress/e2e/learning_records.cy.js" --reporter json --reporter-options "toConsole=false"

goto end

:invalid_choice
echo [错误] 无效的选择，请重新运行脚本
goto end

:end
echo.
echo ================================================
echo 测试完成
echo ================================================

:: 检查是否有测试结果
if exist cypress\results (
    echo [信息] 测试结果已保存到 cypress\results 目录
)

if exist cypress\screenshots (
    echo [信息] 测试截图已保存到 cypress\screenshots 目录
)

if exist cypress\videos (
    echo [信息] 测试视频已保存到 cypress\videos 目录
)

echo.
echo [信息] 端到端测试执行完成
echo [提示] 如果测试失败，请检查:
echo   1. 后端微服务是否正常运行
echo   2. 数据库是否已正确初始化
echo   3. 测试数据是否存在
echo   4. 网络连接是否正常
echo.

pause
